﻿using Rename.UC;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack.Dialogs;
using Rename.Util;
using System.Threading.Tasks;
using Rename.UC.组合;
namespace Rename
{
    public partial class frmMain : Form
    {
        private Uc中间主界面 _currentUc中间主界面 = null;
        public frmMain()
        {
            this.ucMain批量新建文件夹 = new Uc中间主界面(OLSVType.批量新建文件夹);
            this.ucMain提取文件夹名称 = new Uc中间主界面(OLSVType.提取文件夹名称);
            this.ucMain提取文件名称 = new Uc中间主界面(OLSVType.提取文件名称);
            this.ucMain文件夹时间属性 = new Uc中间主界面(OLSVType.文件夹时间属性);
            this.ucMain文件时间属性 = new Uc中间主界面(OLSVType.文件时间属性);
            this.ucMain文件夹重命名 = new Uc中间主界面(OLSVType.文件夹重命名);
            this.ucMain文件重命名 = new Uc中间主界面(OLSVType.文件重命名);
            this.ucMain图片重命名 = new Uc中间主界面(OLSVType.图片重命名);
            InitializeComponent();

            this.ucTabMain.NewFileNameTextChanged += UcTabMain_NewFileNameTextChanged;
            this.ucTabMain.Uc大小写转换.CmbSelectChange += Uc大小写转换_CmbSelectChange;
            
            InitUcMain();
            _currentUc中间主界面 = ucMain图片重命名;
        }
        private void InitUcMain()
        {
            ucMain文件重命名.Visible = true;
            ucMain文件重命名.Dock = DockStyle.Fill;
            ucMain文件重命名.ClearFileHandler += UcAddFileMain_ClearFileHandler;

            ucMain文件夹重命名.Visible = false;
            ucMain文件夹重命名.Dock = DockStyle.None;

            ucMain文件时间属性.Visible = false;
            ucMain文件时间属性.Dock = DockStyle.None;

            ucMain文件夹时间属性.Visible = false;
            ucMain文件夹时间属性.Dock = DockStyle.None;

            ucMain提取文件名称.Visible = false;
            ucMain提取文件名称.Dock = DockStyle.None;

            ucMain提取文件夹名称.Visible = false;
            ucMain提取文件夹名称.Dock = DockStyle.None;
        }

        #region 自定义事件
        #endregion

        private void Uc大小写转换_CmbSelectChange(object sender, CmbSelectChangeEventArgs e)
        {
            Console.WriteLine(e.CmbSelectType.ToString());
           // throw new NotImplementedException();
        }

        private void UcTabMain_NewFileNameTextChanged(object sender, UC.组合.NewFileNameTextChangedEventArgs e)
        {
            Console.WriteLine(e.NewFileName);
            _currentUc中间主界面.Uc中间列表.UcFastOLSV.SetNewFileName(e.NewFileName);
        }

        private void UcFastOLSV_RowsCountChange(object sender, UC.FastOLSV.RowsCountChangeEventArgs e)
        {
            lbl文件数量.Text = e.RowsCount.ToString();
        }
        private void UcAddFileMain_ClearFileHandler(object sender, EventArgs e)
        {
            lbl文件数量.Text = "0";
            uc保存方式.Visible = false;
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            uc保存方式.Visible = false;
            LinkLabelSelectState(ucLink文件重命名, "点击添加 / 拖拽文件夹到此区域");
        }
        private void uc_ClickLinkLabel(object sender, UC.UcLinkLabelEventArgs e)
        {
            UcLinkLabel ucLink = sender as UcLinkLabel;
            LinkLabelSelectState(ucLink,e.Text);
            if (e.Type == UC.CatalogType.Directory)
            {
                ucLinkAddFile.Visible = false;
            }
            if (e.Type == UC.CatalogType.File)
            {
                ucLinkAddFile.Visible = true;
            }
        }

        private void ucLinkAddFile_ClickLinkLabel(object sender, UC.UcLinkLabelEventArgs e)
        {
            var dialog = new CommonOpenFileDialog
            {   
                Title = "同时选择文件和目录",// 配置对话框标题   
                Multiselect = true,// 关键配置：允许多选并禁用文件夹选择限制
                IsFolderPicker = false, // 设为false以允许选择文件         
                EnsureFileExists = false,// 添加必要的选项：强制文件系统项并允许非文件系统项
                EnsurePathExists = true,
                AllowNonFileSystemItems = false // 仅显示实际文件系统项
            };
            if (ucLink图片重命名.IsClicked == true)
            {
                dialog.Filters.Add(new CommonFileDialogFilter("图像文件", "*.jpg;*.jpeg;*.png;*.gif;*.bmp"));
            }
            else
            {
                dialog.Filters.Add(new CommonFileDialogFilter("所有文件", "*.*"));
            }
            if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
            {
                _currentUc中间主界面.AddFileAsync(dialog.FileNames.ToArray(), "", (count) =>
                {
                    this.Invoke(new Action(() =>
                    {
                        lbl文件数量.Text =  count.ToString();
                        uc保存方式.Visible = true;
                    }));
                });
            }
        }

        private async void ucLinkAddDir_ClickLinkLabel(object sender, UcLinkLabelEventArgs e)
        {
            var dialog = new CommonOpenFileDialog
            {
                Title = "同时选择文件和目录",// 配置对话框标题   
                Multiselect = true,// 关键配置：允许多选并禁用文件夹选择限制
                IsFolderPicker = true, // 设为false以允许选择文件         
                EnsureFileExists = false,// 添加必要的选项：强制文件系统项并允许非文件系统项
                EnsurePathExists = true,
                AllowNonFileSystemItems = false // 仅显示实际文件系统项
            };
            if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
            {
                string name = _currentUc中间主界面.Name;
                if(name.Contains("文件夹重命名") || name.Contains("文件夹时间属性") || name.Contains("提取文件夹名称"))
                {
                    _currentUc中间主界面.AddFile(dialog.FileNames.ToArray(), "", (count) =>
                    {
                        lbl文件数量.SetTextAsync(count.ToString());
                    });
                }
                else  //读取目录文件 及 子目录文件
                {
                    List<string> files=await GetAllFiles(dialog.FileNames.ToArray());
                    _currentUc中间主界面.AddFileAsync(files.ToArray(), "", (count) =>
                    {
                        lbl文件数量.SetTextAsync(count.ToString());
                    });
                }
            }
        }

        private async Task<List<string>> GetAllFiles(string[] dirs)
        {
            List<string> fileList = new List<string>();
            await Task.Run(() => {
                int i = 0;
                foreach (var item in dirs)
                {
                    string[] files = FileHelper.GetFileNames(item, "*", true);
                    Console.WriteLine($"{++i}\tGetAllFiles  目录数:{dirs.Length}\t文件数:{files.Length.ToString()}\t{item}");
                    fileList=fileList.Concat(files).ToList();
                }
            });
            return fileList;
        }
    }
}
